/**
 * 文件名：@BindInterceptor.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.interceptor <br/>
 * 项目名：afw-mvc-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.interceptor;

import cn.efunbox.afw.core.annotation.mvc.Bind;
import cn.efunbox.afw.core.annotation.processor.BindProcessor;
import cn.efunbox.afw.core.mvc.context.Context;

/**
 * 类名：BindInterceptor  <br />
 *
 * 功能：数据绑定拦截器
 *
 * @author xtwin <br />
 * 创建时间：2015年12月4日 下午1:58:29  <br />
 * @version 2015年12月4日
 */
public class BindInterceptor extends AbstractInterceptor {
	
	// 绑定处理器
	private BindProcessor bindProcessor;
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月4日 下午4:04:32<br/>
	 * 
	 * @param context
	 * @param handler
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.web.mvc.interceptor.AbstractInterceptor#doPreHandle(cn.efunbox.afw.core.mvc.context.Context, java.lang.Object)
	 */
	@Override
	protected void doPreHandle(Context context, Object handler) throws Exception {
		Bind[] binds = resolveHandlerInfo(context, handler).getBinds();
		
		if (null != binds && binds.length > 0) {
			for (Bind bind : binds) {
				// 由bind处理器进行绑定处理
				bindProcessor.process(context, bind);
			}
		}
		/*if (handler instanceof AfwHandlerMethod) {
			Bind[] binds = ((AfwHandlerMethod) handler).getBinds();
			
			if (null != binds && binds.length > 0) {
				for (Bind bind : binds) {
					// 由bind处理器进行绑定处理
					bindProcessor.process(context, bind);
				}
			}
		}*/
	}

	/**
	 * @version 2015年12月4日-下午4:04:22
	 */
	public void setBindProcessor(BindProcessor bindProcessor) {
		this.bindProcessor = bindProcessor;
	}
	
	// 属性编辑器
	//private PropertyEditor propertyEditor;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月4日 下午1:58:41<br/>
	 * 
	 * @param context
	 * @param handler
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.web.mvc.interceptor.AbstractInterceptor#doPreHandle(cn.efunbox.afw.core.mvc.context.Context, java.lang.Object)
	 */
//	@Override
//	protected void doPreHandle(Context context, Object handler) throws Exception {
//		if (handler instanceof AfwHandlerMethod) {
//			Bind[] binds = ((AfwHandlerMethod) handler).getBinds();
//			
//			if (null != binds && binds.length > 0) {
//				
//				// 取出参数
//				Map<String, Object> values = context.getValue();
//				
//				for (Bind bind : binds) {
//					
//					Class<?> type = bind.type();
//					
//					Object inst = type.newInstance();
//					
//					String prefix = bind.prefix() + ".";
//					
//					for (Entry<String, Object> entry : values.entrySet()) {
//						String key = entry.getKey();
//						
//						if (key.startsWith(prefix)) {
//							/**
//							 * 	字段处理
//							 * 	user.parent.name
//							 */
//							key = key.substring(prefix.length());
//							
//							/*int index = key.indexOf('.');
//							
//							String property = key;
//							if (index != -1) {
//								property = key.substring(0, index);
//							}*/
//							
//							// 属性编辑器
//							propertyEditor.setValue(inst, key, entry.getValue());
//						}
//					}
//					
//					// 更新上下文中的值
//					context.setValue(bind.prefix(), inst);
//				}
//			}
//		}
//	}
//
//	/**
//	 * @version 2015年12月4日-下午3:50:36
//	 */
//	public void setPropertyEditor(PropertyEditor propertyEditor) {
//		this.propertyEditor = propertyEditor;
//	}
	
//	protected Object bind(Class<?> type, String prefix, Map<String, Object> values) throws Exception {
//		
//		Object inst = type.newInstance();
//		
//		prefix = prefix + ".";
//		
//		for (Entry<String, Object> entry : values.entrySet()) {
//			String key = entry.getKey();
//			
//			if (key.startsWith(prefix)) {
//				/**
//				 * 	字段处理
//				 * 	user.parent.name
//				 */
//				key = key.substring(prefix.length());
//				
//				int index = key.indexOf('.');
//				
//				String property = key;
//				if (index != -1) {
//					property = key.substring(0, index);
//				}
//				
//				PropertyDescriptor desc = new PropertyDescriptor(property, type);
//				
//				bind(desc.getPropertyType(), prefix, values);
//			}
//		}
//		
//		if (type.isPrimitive() || type == String.class) {
//			// 基础类型
//			return values.get(prefix);
//		}
//		
//		return inst;
//	}
	
//	protected void bind(Object inst, String netsted, Object value) throws Exception {
//		int index = netsted.indexOf('.');
//		
//		String property = netsted;
//		
//		if (index != -1) {
//			property = netsted.substring(0, index);
//			
//			netsted = netsted.substring(index + 1);
//		}
//		
//		// 创建属性描述
//		PropertyDescriptor pdesc = new PropertyDescriptor(property, inst.getClass());
//		
//		Object _v = value;
//		if (index != -1) {
//			// 复杂类型，要递归处理
//			//_v = bind(pdesc.getReadMethod().invoke(inst), pdesc.getPropertyType(), netsted, value);
//			
//			_v = pdesc.getReadMethod().invoke(inst);
//			
//			if (null == _v) {
//				_v = pdesc.getPropertyType().newInstance();
//			}
//			
//			bind(_v, netsted, value);
//		}
//		
//		pdesc.getWriteMethod().invoke(inst, _v);
//	}
	
	/*protected Object bind(Class<?> type, String prefix, Map<String, Object> values) throws Exception {
		
		if (type.isPrimitive() || type == String.class) {
			// 基础类型
			return values.get(prefix);
		}
		
		PropertyDescriptor[] descs = Introspector.getBeanInfo(type).getPropertyDescriptors();
		
		Object inst = type.newInstance();
		
		for (PropertyDescriptor desc : descs) {
			
			// 取出属性名
			String name = desc.getName();
			
			// 递归调用，处理复杂类型
			Object _value = bind(desc.getPropertyType(), prefix + "." + name, values);
			
			// 将参数值写入到对象中
			desc.getWriteMethod().invoke(inst, _value);
		}
		
		return inst;
	}*/
}
















